package com.yq.day29;


import java.util.concurrent.TimeUnit;

/**
 *模拟死锁
 * @author 3307235355@qq.com
 * @since 2022/06/29 09:20
 */
public class Demo01 {
    public static void main(String[] args) {
        DieLock d1 = new DieLock(true);
        DieLock d2 = new DieLock(false);
        new Thread(d1).start();
        new Thread(d2).start();

    }
}
class MyLock {
    //定义两把锁
    public  static final  Object a =new Object();
    public  static final  Object b =new Object();
    public  static final  Object c =new Object();
}

class  DieLock implements Runnable{
    boolean flag;

    public DieLock(boolean flag) {
        this.flag = flag;
    }

    // @Override
    // public void run() {
    //     //同步代码块嵌套
    //     if (flag){
    //
    //         synchronized (MyLock.a){
    //             System.out.println("if a");
    //             try {
    //                 TimeUnit.SECONDS.sleep(2);
    //             } catch (InterruptedException e) {
    //                 e.printStackTrace();
    //             }
    //
    //             synchronized (MyLock.b){
    //                 System.out.println("if b");
    //             }
    //         }
    //
    //     }else{
    //
    //         synchronized (MyLock.b){
    //             System.out.println("else  bbb");
    //             synchronized (MyLock.a){
    //                 System.out.println("else aaa");
    //             }
    //         }
    //
    //     }
    //
    // }

    //解决的方式一：更改加锁的顺序
    // @Override
    // public void run() {
    //     //同步代码块嵌套
    //     if (flag){
    //
    //         synchronized (MyLock.a){
    //             System.out.println("if a");
    //             try {
    //                 TimeUnit.SECONDS.sleep(2);
    //             } catch (InterruptedException e) {
    //                 e.printStackTrace();
    //             }
    //
    //             synchronized (MyLock.b){
    //                 System.out.println("if b");
    //             }
    //         }
    //
    //     }else{
    //
    //         synchronized (MyLock.a){
    //             System.out.println("else  aaa");
    //             synchronized (MyLock.b){
    //                 System.out.println("else bbb");
    //             }
    //         }
    //
    //     }
    //
    // }



    //方式二:再加一把锁
    @Override
    public void run() {
        //同步代码块嵌套
        if (flag){
            synchronized (MyLock.c){
                synchronized (MyLock.a){
                    System.out.println("if a");
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    synchronized (MyLock.b){
                        System.out.println("if b");
                    }
                }

            }


        }else{
            synchronized (MyLock.c){

                synchronized (MyLock.b){
                    System.out.println("else  bbb");
                    synchronized (MyLock.a){
                        System.out.println("else aaa");
                    }
                }

            }


        }

    }
}